use axum::{
    Json,
    http::Request,
    response::Response,
    middleware::Next, body::Body
};
use serde_json::Value;
use crate::query;
use super::{claims::get_req_claims, jwt::token_encode};
// 生成 token 字符串
pub fn create_token(f:Value) -> Result<String, Json<Value>>{
    let t = token_encode(
        query::i32(&f, "id")?,
        query::i32_op(&f, "cid")?,
        query::i32_op(&f, "role")?,
        // 同一用户同一应该
        // 同一个用户对于不同的小程序有不同的 openid
        // 对于用户来说是唯一标识且没有失效期，所以不适合返回客户端，很不安全的
        query::str(&f, "ident")?,               
        // 同一用户不同应用唯一
        // 用户在开放平台的唯一标识符，若当前小程序已绑定到微信开放平台账号下会返回
        query::str_op(&f, "casc")?,
        // 用于解密获取 userid, userid始终相同，可以用于关联两个小程序  
        query::str(&f, "veri")?,    
       
        None
    )?;
    Ok(t)
}
// 验证接口登录状态的中间件
// 登录验证 token 是否过期，并在一定时间内自动续签 token
pub async fn auth(req: Request<Body>, next: Next) -> Result<Response, Json<Value>>{
    get_req_claims(req, next, true, |_d| Ok(()) ).await
}